// 负责自动加载
import Route from '../kernel/route/route'
import run_route from '../kernel/route/pars_route'
import controRoute from '../kernel/route/controRoute';
import Middleware from '../kernel/middleware/middleware';

export default {get,post,any,midd,Controller,end_controller}

// 声明控制器文件
export async function Controller(ctx,prefix:string){
    global.gem_Route = new Route({
        id          :   ctx.module.id,
        prefix      :   prefix || "",
        middleware  :   []
    });

    //清空
    global.controller={};
    //调用路由
    global.controller[ctx.module.id] = {prefix:prefix || (prefix==="/" ? "" : prefix)};
}

// 挂载any接口
export async function any (ctx:any,url:string){
    if(!controRoute.getUnStaticRoute(ctx.module.filename) || global.gem_Route?.ID!==ctx.module.filename){
        console.log("请先使用@"+"Controller注解后使用@"+"GetMapping",ctx.module.filename);
        return
    }
    
    //调用路由
    global.controller[ctx.module.filename][ctx.methodName] = 
        global.gem_Route.any(url,Middleware.createMiddleware(
            ctx.module.filename,ctx.module.exports.default || ctx.module.exports,ctx.methodName,[]
        ));
    if(ctx.isEnd){await mergeRout();}
}

// 挂载get接口
export async function get (ctx:any,url:string){
    if(!controRoute.getUnStaticRoute(ctx.module.filename) || global.gem_Route?.ID!==ctx.module.filename){
        console.log("请先使用@"+"Controller注解后使用@"+"GetMapping",ctx.module.filename);
        return
    }
    global.controller[ctx.module.filename][ctx.methodName] = 
    global.gem_Route.any(url,Middleware.createMiddleware(
        ctx.module.filename,ctx.module.exports.default || ctx.module.exports,ctx.methodName,[]
    ));
    
    if(ctx.isEnd){await mergeRout();}
}

// 挂载post接口
export async function post (ctx:any,url:string){
    if(!controRoute.getUnStaticRoute(ctx.module.filename) || global.gem_Route?.ID!==ctx.module.filename){
        console.log("请先使用@"+"Controller注解后使用@"+"GetMapping",ctx.module.filename);
        return
    }

    //调用路由 global.controller[filepath][name]中存放中间件调用方法
    global.controller[ctx.module.filename][ctx.methodName]=
    global.gem_Route.any(url,Middleware.createMiddleware(
        ctx.module.filename,ctx.module.exports.default || ctx.module.exports,ctx.methodName,[]
    ));
    if(ctx.isEnd){await mergeRout();}
}

export async function midd (ctx:any,...midd:string[]){
    if(!global?.controller?.[ctx.module.filename]?.[ctx.methodName] || global.gem_Route.ID!==ctx.module.filename){
        console.log("请先使用@"+"Controller注解后使用@"+"Midd",ctx.module.filename,name);
        return
    }

    //调用路由的中间件
    global.controller[ctx.module.filename][ctx.methodName].midd(...midd);
    if(ctx.isEnd){await mergeRout();}
}


// 结束控制器
export async function end_controller (){
    await mergeRout();
}


// 合并路由
async function mergeRout(){
    await run_route.mergeRout();
    global.gem_Route = undefined
}